<?php

/***************** 4.17 根据一个可计算字段对数组排序 ***************/


//问题：希望定义自己的排序例程

// 解决方案
// 结合一个定制比较函数使用 usort()
//usort() 使用用户自定义的比较函数对数组进行排序。

$tests = ['test1.php', 'test10.php', 'test11.php', 'test2.php'];

// strnatcmp() 使用一种"自然排序"算法来比较两个字符串（对大小写敏感）

usort($tests, function ($a, $b) {
    return strnatcmp($b, $a);
});


function date_sort($a, $b)
{
    list($a_month, $a_day, $a_year) = explode('/', $a);
    list($b_month, $b_day, $b_year) = explode('/', $b);

    if ($a_year > $b_year) return 1;
    if ($a_year < $b_year) return -1;

    if ($a_month > $b_month) return 1;
    if ($a_month < $b_month) return -1;

    if ($a_day > $b_day) return 1;
    if ($a_day < $b_day) return -1;

    return 0;
}

$dates = ['12/14/2020', '08/10/2009', '08/07/2019'];

usort($dates, 'date_sort');

/**************************
 * usort() 会频繁地重新计算比较函数的返回值，这个会降低排序的速度。
 * 为了避免不必要的工作，可以缓存比较值，如用 array_map()
 */

//var_dump($dates);
//array(3) {
//  [0]=>
//  string(10) "08/10/2009"
//  [1]=>
//  string(10) "08/07/2019"
//  [2]=>
//  string(10) "12/14/2020"
//}

// 通过 array_map() 缓存值
function array_sort($array, $map_func, $sort_func = '')
{
    $sorted = [];
    $mapped = array_map($map_func, $array);

    if ('' === $sort_func) {
        asort($mapped);
    } else {
        uasort($mapped, $sort_func);
    }

    while (list($key) = each($mapped)) {
        $sorted[] = $array[$key];
    }

    return $sorted;
}


/****************** 4.8 多个数组排序 ************/

// 问题：希望对多个数组或多维数组排序

// 解决方案

// 可以使用 array_multisort()

$colors = ['red', 'white', 'blue'];

$cities = ['boston', 'new york', 'chicago'];

array_multisort($colors, $cities);

print_r($colors);
print_r($cities);